﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using MySql.Data.MySqlClient;
using System.Windows.Forms;
using System.Data;

namespace Gestion
{
    class clsClientesBD
    {
        // Busca los clientes que cumplen unas condiciones.
        // Parámetros:  Campos con el filtro a aplicar en la búsqueda.
        // Retorno:     Tabla de datos con las cuatro columnas a mostrar en la lista.
        public static DataTable Buscar(string pCodCliente, string pDNI, string pNombre,
                                       string pApellidos, int pCodProvincia, bool pBusqFecha,
                                       DateTime pFechaNacDesde, DateTime pFechaNacHasta)
        {
            // Conexión con la base de datos
            MySqlConnection miConexion;

            MySqlDataReader miReader;
            DataTable miTabla = new DataTable();

            // Consulta SQL a ejecutar
            MySqlCommand miComando;
            String strSQL;

            // Crear la conexión con la base de datos 
            miConexion = new MySqlConnection();

            try
            {
                // Asignar la cadena de conexión a la base de datos
                miConexion.ConnectionString = clsComun.getCadenaConexionBD();

                // Abrir la conexión
                miConexion.Open();

                // Preparar la cadena con la sentencia SQL a ejecutar
                strSQL = "select cod_cli, nombre, apellidos, tlf_fijo " +
                         "from clientes where 1=1";

                if (pCodCliente != "")
                    strSQL = strSQL + " and cod_cli = " + pCodCliente;

                if (pDNI != "")
                    strSQL = strSQL + " and dni = '" + pDNI + "'";

                if (pNombre != "")
                    strSQL = strSQL + " and nombre like '%" + pNombre + "%'";

                if (pApellidos != "")
                    strSQL = strSQL + " and apellidos like '%" + pApellidos + "%'";

                // Si no se ha seleccionado la provincia con código 0 (provincia vacía)
                if (pCodProvincia != 0)
                    strSQL = strSQL + " and cod_prov = " + pCodProvincia.ToString();

                if (pBusqFecha)
                {
                    strSQL = strSQL + " and fecha_nac >= '" +
                                      clsComun.FechaSQL(pFechaNacDesde) + "'";

                    strSQL = strSQL + " and fecha_nac <= '" +
                                      clsComun.FechaSQL(pFechaNacHasta) + "'";
                }

                strSQL = strSQL + " order by apellidos, nombre, cod_cli";

                // Preparar el comando con la consulta a ejecutar
                miComando = new MySqlCommand(strSQL, miConexion);

                // Ejecutar la consulta y almacenar el resultado en el objeto Reader
                miReader = miComando.ExecuteReader();

                // Cargo un DataTable con el objeto Reader
                miTabla.Load(miReader);

                // Cierro el objeto Reader
                miReader.Close();
            }
            catch (Exception ex)
            {
                // Si se ha producido una excepción, se vuelve a lanzar
                // para que la gestione quien haya realizado la llamada a este método
                throw ex;
            }
            finally
            {
                // Desconexión de la base de datos
                miConexion.Close();
            }

            return miTabla;
        }

        // Selecciona todos los campos con el detalle de un cliente.
        // Parámetros:  Código del cliente.
        // Retorno:     Objeto con todos los campos del cliente.
        //              Objeto null si el cliente no existe.
        public static clsCliente Detalle(string pCodCliente)
        {
            // Conexión con la base de datos
            MySqlConnection miConexion;

            MySqlDataReader miReader;
            clsCliente miCliente = null;

            // Consulta SQL a ejecutar
            MySqlCommand miComando;
            String strSQL;

            // Crear la conexión con la base de datos 
            miConexion = new MySqlConnection();

            try
            {
                // Asignar la cadena de conexión a la base de datos
                miConexion.ConnectionString = clsComun.getCadenaConexionBD();

                // Abrir la conexión
                miConexion.Open();

                // Preparar la cadena con la sentencia SQL a ejecutar
                strSQL = "select * from clientes where cod_cli = " + pCodCliente;

                // Ejecución de la consulta
                miComando = new MySqlCommand(strSQL, miConexion);

                // Ejecutar la consulta y almacenar el resultado en el objeto Reader
                miReader = miComando.ExecuteReader();

                // Si no se ha obtenido ningún registro, el Cliente ya no existe
                if (miReader.Read() == false)
                {
                    // El objeto a devolver será nulo
                    miCliente = null;
                }
                else
                {
                    // Se carga el objeto con el detalle del Cliente
                    miCliente = new clsCliente();

                    // Cargar el objeto con el cliente seleccionado
                    miCliente.Codigo = miReader.GetString("cod_cli");
                    miCliente.Nombre = miReader.GetString("nombre");
                    miCliente.Apellidos = miReader.GetString("apellidos");
                    miCliente.DNI = miReader.GetString("dni");
                    miCliente.FechaNac = miReader.GetDateTime("fecha_nac");

                    if (miReader.IsDBNull(miReader.GetOrdinal("direccion")))
                        miCliente.Direccion = "";
                    else
                        miCliente.Direccion = miReader.GetString("direccion");

                    if (miReader.IsDBNull(miReader.GetOrdinal("poblacion")))
                        miCliente.Poblacion = "";
                    else
                        miCliente.Poblacion = miReader.GetString("poblacion");

                    if (miReader.IsDBNull(miReader.GetOrdinal("cod_postal")))
                        miCliente.CodPostal = "";
                    else
                        miCliente.CodPostal = miReader.GetString("cod_postal");

                    if (miReader.IsDBNull(miReader.GetOrdinal("cod_prov")))
                        miCliente.CodProvincia = 0;
                    else
                        miCliente.CodProvincia = miReader.GetInt32("cod_prov");

                    if (miReader.IsDBNull(miReader.GetOrdinal("tlf_fijo")))
                        miCliente.TlfFijo = "";
                    else
                        miCliente.TlfFijo = miReader.GetString("tlf_fijo");

                    if (miReader.IsDBNull(miReader.GetOrdinal("tlf_movil")))
                        miCliente.TlfMovil = "";
                    else
                        miCliente.TlfMovil = miReader.GetString("tlf_movil");

                    if (miReader.IsDBNull(miReader.GetOrdinal("email")))
                        miCliente.EMail = "";
                    else
                        miCliente.EMail = miReader.GetString("email");

                    miCliente.Vip = Convert.ToBoolean(miReader.GetString("vip"));

                    miCliente.FormaPago = miReader.GetInt32("forma_pago");

                    if (miReader.IsDBNull(miReader.GetOrdinal("notas")))
                        miCliente.Observaciones = "";
                    else
                        miCliente.Observaciones = miReader.GetString("notas");
                }

                // Cierro el objeto Reader
                miReader.Close();
            }
            catch (Exception ex)
            {
                // Si se ha producido una excepción, genero otra con un nuevo mensaje,
                // para que la gestione quien haya realizado la llamada a este método
                throw new Exception("Error al obtener el detalle del Cliente.\n" + ex.Message);
            }
            finally
            {
                // Desconexión de la base de datos
                miConexion.Close();
            }

            return miCliente;
        }

        // Crea un nuevo cliente a partir de la información recibida.
        // Parámetros:  Objeto con todos los campos del cliente.
        // Retorno:     Código del nuevo cliente creado.
        //              (Se genera excepción en caso de error).
        public static int Crear(clsCliente miCliente)
        {
            // Conexión con la base de datos
            MySqlConnection miConexion;

            // Comando SQL a ejecutar
            MySqlCommand miComando;
            MySqlDataReader miReader;   // Resultado de la selección
            string strSQL;              // Sentencia SQL a ejecutar

            int nuevoCodigo = 0;        // Código del nuevo cliente

            // Crear la conexión con la base de datos 
            miConexion = new MySqlConnection();

            try
            {
                // Asignar la cadena de conexión a la base de datos
                miConexion.ConnectionString = clsComun.getCadenaConexionBD();

                // Abrir la conexión
                miConexion.Open();

                // OBTENER EL CÓDIGO DEL NUEVO CLIENTE

                // Ejecución de la consulta
                strSQL = "select max(cod_cli) as codigo from clientes";
                miComando = new MySqlCommand(strSQL, miConexion);

                // Procesar el resultado de la consulta SQL
                miReader = miComando.ExecuteReader();

                // Leer el elemento seleccionado
                miReader.Read();

                // Devolverá null si no hay ningún Cliente en la BD
                if (miReader.IsDBNull(miReader.GetOrdinal("codigo")))
                    nuevoCodigo = 0;
                else
                    nuevoCodigo = miReader.GetInt32("codigo");

                nuevoCodigo = nuevoCodigo + 1;      // Se asigna el siguiente código

                // Desconexión del DataReader
                miReader.Close();


                // INSERTAR EL NUEVO CLIENTE

                // Preparo la cadena de la sentencia INSERT a ejecutar
                strSQL = "INSERT INTO CLIENTES " +
                         "(cod_cli, nombre, apellidos, dni, fecha_nac, " +
                         "direccion, poblacion, cod_postal, cod_prov, " +
                         "tlf_fijo, tlf_movil, email, vip, forma_pago, notas) " +
                         "VALUES " +
                         "(@cod_cli, @nombre, @apellidos, @dni, @fecha_nac, " +
                         "@direccion, @poblacion, @cod_postal, @cod_prov, " +
                         "@tlf_fijo, @tlf_movil, @email, @vip, @forma_pago, @notas)";

                // Cargar el nuevo código con el resto de valores a reemplazar
                miCliente.Codigo = nuevoCodigo.ToString();

                // Reemplazar la marca de cada campo por su valor correspondiente
                strSQL = MontarCadena(strSQL, miCliente);

                //miComando.Parameters.AddWithValue("@nombre", miCliente.Nombre);

                miComando = new MySqlCommand(strSQL, miConexion);

                

                // Ejecutar la sentencia SQL
                miComando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                // Si se ha producido una excepción, se vuelve a lanzar
                // para que la gestione quien haya realizado la llamada a este método
                throw ex;
            }
            finally
            {
                // Desconexión de la base de datos
                miConexion.Close();
            }

            return nuevoCodigo;
        }

        // Modificar el cliente a partir de la información recibida.
        // Parámetros:  Objeto con todos los campos del cliente.
        // Retorno:     Número de registros procesados.
        //              (Se genera excepción en caso de error).
        public static int Modificar(clsCliente miCliente)
        {
            // Conexión con la base de datos
            MySqlConnection miConexion;

            // Comando SQL a ejecutar
            MySqlCommand miComando;
            string strSQL;              // Sentencia SQL a ejecutar
            int numReg = 0;             // Número de registros procesados

            // Crear la conexión con la base de datos 
            miConexion = new MySqlConnection();

            try
            {
                // Asignar la cadena de conexión a la base de datos
                miConexion.ConnectionString = clsComun.getCadenaConexionBD();

                // Abrir la conexión
                miConexion.Open();

                // ACTUALIZAR EL CLIENTE

                // Preparar la cadena de la sentencia UPDATE a ejecutar
                strSQL = "UPDATE CLIENTES SET " +
                            "nombre = @nombre, apellidos = @apellidos, dni = @dni, " +
                            "fecha_nac = @fecha_nac, direccion = @direccion, " +
                            "poblacion = @poblacion, cod_postal = @cod_postal, " +
                            "cod_prov = @cod_prov, tlf_fijo = @tlf_fijo, " +
                            "tlf_movil = @tlf_movil, email = @email, vip = @vip, " +
                            "forma_pago = @forma_pago, notas = @notas " +
                            "WHERE cod_cli = @cod_cli";

                // Reemplazar la marca de cada campo por su valor correspondiente
                strSQL = MontarCadena(strSQL, miCliente);

                miComando = new MySqlCommand(strSQL, miConexion);

                // Ejecutar la sentencia SQL
                numReg = miComando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                // Si se ha producido una excepción, se vuelve a lanzar
                // para que la gestione quien haya realizado la llamada a este método
                throw ex;
            }
            finally
            {
                // Desconexión de la base de datos
                miConexion.Close();
            }

            return numReg;
        }

        // Borrar el cliente a partir del código recibido.
        // Parámetros:  Código del cliente a borrar.
        // Retorno:     Número de registros procesados.
        //              (Se genera excepción en caso de error).
        public static int Borrar(string pCodCliente)
        {
            // Conexión con la base de datos
            MySqlConnection miConexion;

            // Comando SQL a ejecutar
            MySqlCommand miComando;
            string strSQL;              // Sentencia SQL a ejecutar
            int numReg = 0;             // Número de registros procesados

            // Crear la conexión con la base de datos 
            miConexion = new MySqlConnection();

            try
            {
                // Asignar la cadena de conexión a la base de datos
                miConexion.ConnectionString = clsComun.getCadenaConexionBD();

                // Abrir la conexión
                miConexion.Open();

                // Preparar la cadena de la sentencia DELETE a ejecutar

                strSQL = "delete from clientes where cod_cli = @cod_cli";
                strSQL = strSQL.Replace("@cod_cli", pCodCliente);

                miComando = new MySqlCommand(strSQL, miConexion);

                // Ejecutar la sentencia SQL
                numReg = miComando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                // Si se ha producido una excepción, se vuelve a lanzar
                // para que la gestione quien haya realizado la llamada a este método
                throw ex;
            }
            finally
            {
                // Desconexión de la base de datos
                miConexion.Close();
            }

            return numReg;
        }

        private static string MontarCadena(string strSQL, clsCliente miCliente)
        {
            // Reemplazar la marca de cada campo por su valor correspondiente

            //miComando.Parameters.AddWithValue("@nombre", miCliente.Nombre);

            strSQL = strSQL.Replace("@cod_cli", miCliente.Codigo);
            strSQL = strSQL.Replace("@nombre", "'" + miCliente.Nombre + "'");
            strSQL = strSQL.Replace("@apellidos", "'" + miCliente.Apellidos + "'");
            strSQL = strSQL.Replace("@dni", "'" + miCliente.DNI + "'");
            strSQL = strSQL.Replace("@fecha_nac",
                                    "'" + clsComun.FechaSQL(miCliente.FechaNac) + "'");

            if (miCliente.Direccion.Length == 0)
                strSQL = strSQL.Replace("@direccion", "null");
            else
                strSQL = strSQL.Replace("@direccion", "'" + miCliente.Direccion + "'");

            if (miCliente.Poblacion.Length == 0)
                strSQL = strSQL.Replace("@poblacion", "null");
            else
                strSQL = strSQL.Replace("@poblacion", "'" + miCliente.Poblacion + "'");

            if (miCliente.CodPostal.Length == 0)
                strSQL = strSQL.Replace("@cod_postal", "null");
            else
                strSQL = strSQL.Replace("@cod_postal", miCliente.CodPostal);

            // Si se ha seleccionado la provincia con código 0 (provincia vacía)
            if (miCliente.CodProvincia == 0)
                strSQL = strSQL.Replace("@cod_prov", "null");
            else
                strSQL = strSQL.Replace("@cod_prov",
                                        miCliente.CodProvincia.ToString());

            if (miCliente.TlfFijo.Length == 0)
                strSQL = strSQL.Replace("@tlf_fijo", "null");
            else
                strSQL = strSQL.Replace("@tlf_fijo", miCliente.TlfFijo);

            if (miCliente.TlfMovil.Length == 0)
                strSQL = strSQL.Replace("@tlf_movil", "null");
            else
                strSQL = strSQL.Replace("@tlf_movil", miCliente.TlfMovil);

            if (miCliente.EMail.Length == 0)
                strSQL = strSQL.Replace("@email", "null");
            else
                strSQL = strSQL.Replace("@email", "'" + miCliente.EMail + "'");

            if (miCliente.Vip)
                strSQL = strSQL.Replace("@vip", "1");
            else
                strSQL = strSQL.Replace("@vip", "0");

            strSQL = strSQL.Replace("@forma_pago", miCliente.FormaPago.ToString());

            if (miCliente.Observaciones.Length == 0)
                strSQL = strSQL.Replace("@notas", "null");
            else
                strSQL = strSQL.Replace("@notas", "'" + miCliente.Observaciones + "'");

            return strSQL;
        }

    }
}
